package com.app.common.core.domain.entity;

import org.springframework.web.multipart.MultipartFile;

/**
 * HivisionIDPhotosReq
 * <p>
 * 证件照生成请求参数实体类，
 * 用于调用 Hivision 证件照接口时传递相关配置参数。
 *
 * <p>支持以下功能：
 * <ul>
 *     <li>上传图片文件</li>
 *     <li>设置证件照尺寸、高分辨率选项</li>
 *     <li>选择人像分割模型、人脸检测模型</li>
 *     <li>调整亮度、对比度、饱和度、锐化等参数</li>
 *     <li>人脸自动对齐与头部比例控制</li>
 * </ul>
 *
 * 默认值已在无参构造函数中初始化。
 *
 * @author 徐朴芬
 */
public class HivisionIDPhotosReq {

    /** 上传的原始图片文件 */
    private MultipartFile input_image;

    // ================= 默认常量 =================

    /** 默认证件照高度（单位：像素） */
    public static final int DEFAULT_HEIGHT = 413;

    /** 默认证件照宽度（单位：像素） */
    public static final int DEFAULT_WIDTH = 295;

    /** 默认人像分割模型 */
    public static final HumanMattingModel DEFAULT_HUMAN_MATTING_MODEL = HumanMattingModel.birefnet_v1_lite;

    /** 默认人脸检测模型 */
    public static final FaceDetectModel DEFAULT_FACE_DETECT_MODEL = FaceDetectModel.retinaface_resnet50;

    /** 默认是否生成高清图像 */
    public static final boolean DEFAULT_HD = true;

    /** 默认图像分辨率（单位：dpi） */
    public static final int DEFAULT_DPI = 300;

    /** 默认是否进行人脸对齐 */
    public static final Boolean DEFAULT_FACE_ALIGNMENT = true;

    /** 默认头部面积占照片面积比例（0~1） */
    public static final float DEFAULT_HEAD_MEASURE_RATIO = 0.2f;

    /** 默认头部中心距顶部的高度比例（0~1） */
    public static final float DEFAULT_HEAD_HEIGHT_RATIO = 0.45f;

    /** 默认头部距顶部最大距离比例（0~1） */
    public static final float DEFAULT_TOP_DISTANCE_MAX = 0.12f;

    /** 默认头部距顶部最小距离比例（0~1） */
    public static final float DEFAULT_TOP_DISTANCE_MIN = 0.1f;

    /** 默认亮度调整强度（-1~1） */
    public static final float DEFAULT_BRIGHTNESS_STRENGTH = 0f;

    /** 默认对比度调整强度（-1~1） */
    public static final float DEFAULT_CONTRAST_STRENGTH = 0f;

    /** 默认锐化强度（0~1） */
    public static final float DEFAULT_SHARPEN_STRENGTH = 0f;

    /** 默认饱和度调整强度（-1~1） */
    public static final float DEFAULT_SATURATION_STRENGTH = 0f;

    // ================= 请求参数字段 =================

    /** 证件照高度（单位：像素），默认 413 */
    private Integer height;

    /** 证件照宽度（单位：像素），默认 295 */
    private Integer width;

    /** 人像分割模型（用于抠图） */
    private HumanMattingModel humanMattingModel;

    /** 人脸检测模型（用于识别五官位置） */
    private FaceDetectModel faceDetectModel;

    /** 是否生成高清证件照，默认 true */
    private Boolean hd;

    /** 图像分辨率（单位：dpi），默认 300 */
    private Integer dpi;

    /** 是否进行人脸自动对齐，默认 true */
    private Boolean faceAlignment;

    /** 面部占整张照片的比例（0~1），默认 0.2 */
    private Float headMeasureRatio;

    /** 面部中心距顶部的高度比例（0~1），默认 0.45 */
    private Float headHeightRatio;

    /** 头部距顶部的最大距离比例（0~1），默认 0.12 */
    private Float topDistanceMax;

    /** 头部距顶部的最小距离比例（0~1），默认 0.1 */
    private Float topDistanceMin;

    /** 亮度调整强度（-1~1），默认 0 */
    private Float brightnessStrength;

    /** 对比度调整强度（-1~1），默认 0 */
    private Float contrastStrength;

    /** 锐化强度（0~1），默认 0 */
    private Float sharpenStrength;

    /** 饱和度调整强度（-1~1），默认 0 */
    private Float saturationStrength;

    // ================= 枚举定义 =================

    /**
     * 人像分割模型类型
     * <p>用于背景分离、换底色等操作。</p>
     */
    public enum HumanMattingModel {
        /** modnet_photographic_portrait_matting 模型（较老） */
        modnet_photographic_portrait_matting,
        /** hivision_modnet 模型（优化版） */
        hivision_modnet,
        /** rmbg-1.4 模型（轻量版） */
        rmbg_1_4,
        /** birefnet-v1-lite 模型（默认推荐，高精度轻量） */
        birefnet_v1_lite
    }

    /**
     * 人脸检测模型类型
     * <p>用于识别人脸关键点并对齐。</p>
     */
    public enum FaceDetectModel {
        /** mtcnn 模型（轻量） */
        mtcnn,
        /** face++ 模型（商用接口） */
        face_plus_plus,
        /** retinaface-resnet50 模型（默认推荐，高精度） */
        retinaface_resnet50
    }

    // ================= 构造函数 =================

    /**
     * 无参构造函数
     * <p>自动填充默认值。</p>
     */
    public HivisionIDPhotosReq() {
        this.height = DEFAULT_HEIGHT;
        this.width = DEFAULT_WIDTH;
        this.humanMattingModel = DEFAULT_HUMAN_MATTING_MODEL;
        this.faceDetectModel = DEFAULT_FACE_DETECT_MODEL;
        this.hd = DEFAULT_HD;
        this.dpi = DEFAULT_DPI;
        this.faceAlignment = DEFAULT_FACE_ALIGNMENT;
        this.headMeasureRatio = DEFAULT_HEAD_MEASURE_RATIO;
        this.headHeightRatio = DEFAULT_HEAD_HEIGHT_RATIO;
        this.topDistanceMax = DEFAULT_TOP_DISTANCE_MAX;
        this.topDistanceMin = DEFAULT_TOP_DISTANCE_MIN;
        this.brightnessStrength = DEFAULT_BRIGHTNESS_STRENGTH;
        this.contrastStrength = DEFAULT_CONTRAST_STRENGTH;
        this.sharpenStrength = DEFAULT_SHARPEN_STRENGTH;
        this.saturationStrength = DEFAULT_SATURATION_STRENGTH;
    }

    /**
     * 全参构造函数
     *
     * @param height             证件照高度（像素）
     * @param width              证件照宽度（像素）
     * @param humanMattingModel  人像分割模型
     * @param faceDetectModel    人脸检测模型
     * @param hd                 是否生成高清图像
     * @param dpi                图像分辨率（dpi）
     * @param faceAlignment      是否进行人脸对齐
     * @param headMeasureRatio   面部面积比例
     * @param headHeightRatio    面部中心与顶部比例
     * @param topDistanceMax     头部距顶部最大比例
     * @param topDistanceMin     头部距顶部最小比例
     * @param brightnessStrength 亮度调整强度
     * @param contrastStrength   对比度调整强度
     * @param sharpenStrength    锐化强度
     * @param saturationStrength 饱和度调整强度
     */
    public HivisionIDPhotosReq(Integer height, Integer width,
                               HumanMattingModel humanMattingModel,
                               FaceDetectModel faceDetectModel,
                               Boolean hd, Integer dpi, Boolean faceAlignment,
                               Float headMeasureRatio, Float headHeightRatio,
                               Float topDistanceMax, Float topDistanceMin,
                               Float brightnessStrength, Float contrastStrength,
                               Float sharpenStrength, Float saturationStrength) {
        this.height = height;
        this.width = width;
        this.humanMattingModel = humanMattingModel;
        this.faceDetectModel = faceDetectModel;
        this.hd = hd;
        this.dpi = dpi;
        this.faceAlignment = faceAlignment;
        this.headMeasureRatio = headMeasureRatio;
        this.headHeightRatio = headHeightRatio;
        this.topDistanceMax = topDistanceMax;
        this.topDistanceMin = topDistanceMin;
        this.brightnessStrength = brightnessStrength;
        this.contrastStrength = contrastStrength;
        this.sharpenStrength = sharpenStrength;
        this.saturationStrength = saturationStrength;
    }

    public MultipartFile getInput_image() {
        return input_image;
    }

    public void setInput_image(MultipartFile input_image) {
        this.input_image = input_image;
    }

    public Integer getHeight() {
        return height;
    }

    public void setHeight(Integer height) {
        this.height = height;
    }

    public Integer getWidth() {
        return width;
    }

    public void setWidth(Integer width) {
        this.width = width;
    }

    public HumanMattingModel getHumanMattingModel() {
        return humanMattingModel;
    }

    public void setHumanMattingModel(HumanMattingModel humanMattingModel) {
        this.humanMattingModel = humanMattingModel;
    }

    public FaceDetectModel getFaceDetectModel() {
        return faceDetectModel;
    }

    public void setFaceDetectModel(FaceDetectModel faceDetectModel) {
        this.faceDetectModel = faceDetectModel;
    }

    public Boolean getHd() {
        return hd;
    }

    public void setHd(Boolean hd) {
        this.hd = hd;
    }

    public Integer getDpi() {
        return dpi;
    }

    public void setDpi(Integer dpi) {
        this.dpi = dpi;
    }

    public Boolean getFaceAlignment() {
        return faceAlignment;
    }

    public void setFaceAlignment(Boolean faceAlignment) {
        this.faceAlignment = faceAlignment;
    }

    public Float getHeadMeasureRatio() {
        return headMeasureRatio;
    }

    public void setHeadMeasureRatio(Float headMeasureRatio) {
        this.headMeasureRatio = headMeasureRatio;
    }

    public Float getHeadHeightRatio() {
        return headHeightRatio;
    }

    public void setHeadHeightRatio(Float headHeightRatio) {
        this.headHeightRatio = headHeightRatio;
    }

    public Float getTopDistanceMax() {
        return topDistanceMax;
    }

    public void setTopDistanceMax(Float topDistanceMax) {
        this.topDistanceMax = topDistanceMax;
    }

    public Float getTopDistanceMin() {
        return topDistanceMin;
    }

    public void setTopDistanceMin(Float topDistanceMin) {
        this.topDistanceMin = topDistanceMin;
    }

    public Float getBrightnessStrength() {
        return brightnessStrength;
    }

    public void setBrightnessStrength(Float brightnessStrength) {
        this.brightnessStrength = brightnessStrength;
    }

    public Float getContrastStrength() {
        return contrastStrength;
    }

    public void setContrastStrength(Float contrastStrength) {
        this.contrastStrength = contrastStrength;
    }

    public Float getSharpenStrength() {
        return sharpenStrength;
    }

    public void setSharpenStrength(Float sharpenStrength) {
        this.sharpenStrength = sharpenStrength;
    }

    public Float getSaturationStrength() {
        return saturationStrength;
    }

    public void setSaturationStrength(Float saturationStrength) {
        this.saturationStrength = saturationStrength;
    }

    @Override
    public String toString() {
        return "HivisionIDPhotosReq{" +
                "input_image=" + input_image +
                ", height=" + height +
                ", width=" + width +
                ", humanMattingModel=" + humanMattingModel +
                ", faceDetectModel=" + faceDetectModel +
                ", hd=" + hd +
                ", dpi=" + dpi +
                ", faceAlignment=" + faceAlignment +
                ", headMeasureRatio=" + headMeasureRatio +
                ", headHeightRatio=" + headHeightRatio +
                ", topDistanceMax=" + topDistanceMax +
                ", topDistanceMin=" + topDistanceMin +
                ", brightnessStrength=" + brightnessStrength +
                ", contrastStrength=" + contrastStrength +
                ", sharpenStrength=" + sharpenStrength +
                ", saturationStrength=" + saturationStrength +
                '}';
    }
}
